// 导入 http 模块
import http from 'wechat-http' // 基于wx.request
/**
 * 配置接口基础路径
 */
http.baseURL = 'https://live-api.itheima.net'

// 请求拦截器
http.intercept.request = (config) => {
  // console.log(config)
  // 获取token
  const token = getApp().token
  const defaultHeader = {
    Authorization: token,
  }
  if (token) {
    // 有token 时 添加请求头信息
    // config.header = {
    //   ...defaultHeader,
    //   ...config.header
    // }
    config.header = Object.assign({}, defaultHeader, config.header)
  }

  return config
}

// http.intercept.request = (config) => {
//   // console.log(config)
//   // 获取token
//   const token = getApp().token
//   if (token) {
//     // 有token 时 添加请求头信息
//     config.header = {
//       Authorization: token,
//     }
//   }

//   return config
// }

/**
 * 配置响应拦截器
 */
http.intercept.response = async (res) => {
  // console.log(res, 999)
  // 只要401 就会发请求 刷新token!!!
  // 刷新token也有可能出现401 => 死循环

  if (res.statusCode === 401) {
    // 判断当前这个401到底是正常token失效的401? 还是刷新token导致的401
    if (res.config.url.includes('/refreshToken')) {
      // 刷新token导致的401 => 无法刷新token => 只能自己回登录页
      const pages = getCurrentPages()
      const currentPage = pages[pages.length - 1]

      return wx.redirectTo({
        url: '/pages/login/index?backTo=/' + currentPage.route,
      })
    }

    // 如果连refresh_token 都没有 那么请求刷新token 没有任何意义(一定失败)
    if (!getApp().refresh_token) return

    // token失效 => 刷新token(调用后端接口 传refresh_token)
    // axios.get axios.post  axios({method: 'get'})
    // console.log(getApp().refresh_token, 888)
    const { data } = await http({
      url: '/refreshToken',
      method: 'post',
      header: {
        Authorization: getApp().refresh_token,
      },
    })

    // console.log(data);
    // 更新token
    getApp().setToken(data.token, data.refreshToken)

    // 为了做到真正的无感 之前401的请求 我帮你重新发
    // res.config  就是这次请求相关的参数对象
    return http({
      ...res.config,
      header: {
        Authorization: getApp().token, // 更新后的token
      },
    })
  }

  // 过滤接口返回的数据
  return res.data
}

/**
 * 挂载方法到全局
 */
wx.http = http
/**
 * 模块导出
 */
export default http
